#include "head.h" //UI实现功能

// 显示菜单并获取用户选择
int display_menu(const wchar_t *title, const wchar_t *choices[], int n_choices)
{
    // 设置语言环境，确保可以处理多字节字符（如中文）
    setlocale(LC_ALL, "");

    // 初始化 ncurses 库
    initscr();
    clear();
    noecho();
    cbreak();
    curs_set(0);

    int highlight = 1;
    int choice = 0;
    int c; // 使用int而不是char，以处理ncurses中的特殊键值

    // 创建窗口用于显示菜单，设置窗口大小为全屏
    WINDOW *menu_win = newwin(LINES, COLS, 0, 0);
    keypad(menu_win, TRUE);

    update_menu(menu_win, title, highlight, choices, n_choices); // 显示菜单

    // 菜单交互循环
    while (1)
    {
        c = wgetch(menu_win);
        switch (c)
        {
        case KEY_UP:
            highlight = (highlight == 1) ? n_choices : highlight - 1;
            break;
        case KEY_DOWN:
            highlight = (highlight == n_choices) ? 1 : highlight + 1;
            break;
        case 10: // Enter 键
            choice = highlight;
            break;
        default:
            break;
        }
        update_menu(menu_win, title, highlight, choices, n_choices);
        if (choice != 0) // 如果按了回车键，则退出循环
            break;
    }

    // 结束 ncurses 模式
    setlocale(LC_ALL, "");
    endwin();

    return choice; // 返回用户选择的选项值
}

// 更新并显示菜单
void update_menu(WINDOW *menu_win, const wchar_t *title, int highlight, const wchar_t *choices[], int n_choices)
{
    int x, y;

    // 计算标题的水平居中位置，并稍微向上移动
    int title_y = 2;                                                      // 标题的位置固定在上面
    int title_x = ((COLS - wcslen(title) - (wcslen(title) / 4)) / 2) - 2; // 计算标题的水平居中位置，留出 * * 的位置

    // 绘制标题及其修饰
    for (size_t i = 0; i < COLS; i++)
    {
        mvwprintw(menu_win, title_y - 1, i, "*", title);
        mvwprintw(menu_win, title_y + 1, i, "*", title);
    }

    mvwprintw(menu_win, title_y, title_x, " %ls ", title);

    // 计算菜单项的起始行位置，确保其在标题下方居中显示
    int start_y = (LINES - n_choices) / 2;

    // 绘制菜单项
    box(menu_win, 0, 0);
    for (int i = 0; i < n_choices; ++i)
    {
        y = start_y + i;                     // 逐行打印菜单项
        x = (COLS - wcslen(choices[i])) / 2; // 计算每个菜单项的水平居中位置

        if (highlight == i + 1)
        {
            wattron(menu_win, A_REVERSE | A_BOLD); // 高亮并加粗当前选项
            mvwprintw(menu_win, y, x, "%ls", choices[i]);
            wattroff(menu_win, A_REVERSE | A_BOLD);
        }
        else
        {
            mvwprintw(menu_win, y, x, "%ls", choices[i]);
        }
    }

    wrefresh(menu_win);
}

void ui_clear(void) // 清空终端
{
    system("clear");
    return;
}

// 登录功能
u_data Log_in(u_list *list)
{

    if (list == NULL)
    {
        printf("链表为空\n");
        exit(-1);
    }
    if (list->next == NULL)
    {
        printf("链表内无数据\n");
        exit(-1);
    }

    u_data data;
    int j = 3;

    // 开始登录
    while (j != 0)
    {
        system("clear");
        printf("欢迎使用扶摇九天系统\n");
        printf("请输入账号: ");
        scanf("%s", data.name);

        printf("请输入密码: ");
        scanf("%s", data.passwd);

        u_node *ptr = list->next;

        do
        {
            // 比较用户名
            if (strcmp(data.name, ptr->data.name) == 0)
            {
                // 比较密码
                if (strcmp(data.passwd, ptr->data.passwd) == 0)
                {
                    return ptr->data; // 登录成功，返回用户信息
                }
            }
            ptr = ptr->next;

        } while (ptr != list->next);
        j--;

        // system("clear");

        printf("用户名密码错误，还有%d次请重新输入。\n", j);
        sleep(1);
    }
    exit(0);
}

